/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.Date;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;
import org.apache.log4j.Logger;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarError;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKCosteoImportacion;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.TIPO_DOC_COMPRA;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCompraFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioCosteoImportacion;
import pe.com.cotelasa.scp.dominio.service.IServicioIgv;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.entidad.CompraFacturacion;
import pe.com.cotelasa.scp.entidad.CosteoArticulo;
import pe.com.cotelasa.scp.entidad.CosteoImportacion;
import pe.com.cotelasa.scp.entidad.DetalleCompraFacturacion;
import pe.com.cotelasa.scp.entidad.GastoAduana;
import pe.com.cotelasa.scp.entidad.Proveedor;

/**
 *
 * @author WINDOWS 7
 */
@Named(value = "MBCosteoImportacion")
@Scope("request")
public class MBCosteoImportacion extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static Logger logger = Logger.getLogger(MBCourier.class);
    @Inject
    private BKCosteoImportacion bk;
    @Inject
    private IServicioIgv servicioIgv;
    @Inject
    private IServicioTipoMoneda servicioMoneda;
    @Inject
    private IServicioCosteoImportacion servicio;
    @Inject
    private IServicioCompraFacturacion servicioFactura;
    @Inject
    private MBComponenteFindProveedor mbComponenteFindProveedor;
    @Inject
    private MBComponenteFindCompraFacturacion mbComponenteFindCompraFacturacion;
    @Autowired
    BKSession session;

    public String buscarCosteos() {
        try {
            bk.setListaCosteosActivos(servicio.buscarCosteoPorFlitro(bk.getCosteoBusqueda(), bk.getFechaInicio(), bk.getFechaFinal()));
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            e.printStackTrace();
        }
        return URLPaginacion.Courier.URL_CONSULTAR_COURIER;
    }

    public String mostrar() {
        bk.setListaCosteosActivos(null);
        bk.setCosteoBusqueda(new CosteoImportacion());
        bk.getCosteoBusqueda().setCodigo("");
        bk.getCosteoBusqueda().setIdFacturaCompra(new CompraFacturacion());
        bk.getCosteoBusqueda().getIdFacturaCompra().setNumeroFactura("");
        bk.getCosteoBusqueda().setIdEmpresa(session.getEmpresa());
        return URLPaginacion.CosteoImportacion.URL_CONSULTAR_COSTEO_IMPORTACION;
    }

    @Override
    public String nuevo() {
        this.bk.setComando(new ComandoGuardar(this));
        mbComponenteFindProveedor.clearObserver();
        mbComponenteFindProveedor.addObserver(this);
        mbComponenteFindCompraFacturacion.clearObserver();
        mbComponenteFindCompraFacturacion.addObserver(this);

        bk.setListaGastoAduana(new ArrayList<GastoAduana>());
        bk.setListaGastoAduanaEditar(new ArrayList<GastoAduana>());
        bk.setGastoAduanaFormulario(new GastoAduana());
        bk.getGastoAduanaFormulario().setIdProveedor(new Proveedor());

        bk.setCosteoFormulario(new CosteoImportacion());
        bk.setListaCosteoArticulo(new ArrayList<CosteoArticulo>());
        bk.getCosteoFormulario().setIdFacturaCompra(new CompraFacturacion());
        bk.getCosteoFormulario().getIdFacturaCompra().setTipoCompPago(TIPO_DOC_COMPRA.FACTURA_IMPORTACION.getValor());

        try {
            bk.setListaMonedas(servicioMoneda.listarTipoMonedasActivos());
            bk.setIgv(servicioIgv.ConseguirIgvPorFecha(new Date()).getMonto().divide(new BigDecimal(100)));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.CosteoImportacion.URL_FORMULARIO_COSTEO_IMPORTACION;
    }

    @Override
    public String editar() {
        this.bk.setComando(new ComandoActualizar(this));
        mbComponenteFindProveedor.clearObserver();
        mbComponenteFindProveedor.addObserver(this);
        mbComponenteFindCompraFacturacion.clearObserver();
        mbComponenteFindCompraFacturacion.addObserver(this);

        try {
            bk.setCosteoFormulario(servicio.conseguirCosteoImportacionPorId(bk.getCosteoFormulario().getId()));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }

        return URLPaginacion.CosteoImportacion.URL_FORMULARIO_COSTEO_IMPORTACION;
    }

    @Override
    public String guardar() {
        bk.getCosteoFormulario().setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
        bk.getCosteoFormulario().setFecCreacion(new Date());
        bk.getCosteoFormulario().setUsrCreacion(session.getUsuario().getUsuario());

        generarCodigo();

        for (GastoAduana gasto : bk.getListaGastoAduana()) {
            System.out.println("det: " + gasto.getDocumento());
            gasto.setIdCosteoImportacion(bk.getCosteoFormulario());
        }
        bk.getCosteoFormulario().setGastoAduanaCollection(bk.getListaGastoAduana());
        try {
            servicio.guardarCosteoImportacion(bk.getCosteoFormulario());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.CosteoImportacion.URL_CONSULTAR_COSTEO_IMPORTACION;
    }

    @Override
    public String actualizar() {

        bk.getCosteoFormulario().setFecModificacion(new Date());
        bk.getCosteoFormulario().setUsrModificacion(session.getUsuario().getUsuario());

        for (GastoAduana gasto : bk.getListaGastoAduanaEditar()) {
            System.out.println("entroooo");
            if (gasto.getId() == null) {
                System.out.println("en troooo");
                gasto.setIdCosteoImportacion(bk.getCosteoFormulario());
            }
        }
        bk.getCosteoFormulario().setGastoAduanaCollection(bk.getListaGastoAduanaEditar());
        try {
            servicio.guardarCosteoImportacion(bk.getCosteoFormulario());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }

        return URLPaginacion.CosteoImportacion.URL_CONSULTAR_COSTEO_IMPORTACION;
    }

    @Override
    public String ver() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        return URLPaginacion.CosteoImportacion.URL_CONSULTAR_COSTEO_IMPORTACION;
    }

    @Override
    public void actualizarObservador(Object object) {
        if (object instanceof Proveedor) {
            //try{
            //Proveedor proveedor = servicioProveedor.conseguirProveedorPorId(((Proveedor) object).getId());
            bk.getGastoAduanaFormulario().setIdProveedor((Proveedor) object);

            /*} catch (ServiceException e) {
             e.printStackTrace();
             }*/
        }
        if (object instanceof CompraFacturacion) {
            try {
                CompraFacturacion factura = servicioFactura.conseguirCompraFacturacionPorId(((CompraFacturacion) object).getId());
                if (servicio.conseguirCosteoImportacionPorFactura(factura.getId()) == null) {
                    bk.setListaCosteoArticulo(new ArrayList<CosteoArticulo>());
                    BigDecimal cantidad = BigDecimal.ZERO;
                    for (DetalleCompraFacturacion det : factura.getDetalleFacturaCollection()) {
                        if (det.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                            CosteoArticulo costeo = new CosteoArticulo();
                            costeo.setCantidad(det.getCantidad());
                            costeo.setIdArticulo(det.getIdArticulo());
                            costeo.setTotal(det.getPrecioTotal());
                            costeo.setPorcAdvalorem(BigDecimal.ZERO);
                            cantidad = cantidad.add(det.getCantidad());
                            bk.getListaCosteoArticulo().add(costeo);
                        }
                    }

                    bk.getCosteoFormulario().setCantidad(cantidad);
                    bk.getCosteoFormulario().setTotal(factura.getTotal());
                    bk.getCosteoFormulario().setFlete(factura.getValorCFR());
                    bk.getCosteoFormulario().setSeguro(factura.getValorCIF());
                    bk.getCosteoFormulario().setIdFacturaCompra(factura);
                    bk.getCosteoFormulario().setAduana(BigDecimal.ZERO);

                }else{
                    mostrarError("Esta factura ya fue costeada.");
                }
                //Proveedor proveedor = servicioProveedor.conseguirProveedorPorId(((Proveedor) object).getId());
                //bk.getGastoAduanaFormulario().setIdProveedor((Proveedor) object);
            } catch (ServiceException e) {
                e.printStackTrace();
            }
        }
    }

    public void generarCodigo() {
        String format = "%1$03d";

        Integer numero = 0;
        try {
            numero = servicio.buscarCantidadCosteo(bk.getCosteoFormulario());
            System.out.println("numero1: " + numero);
            if (numero == 0) {

                bk.getCosteoFormulario().setCodigo("001-" + UtilitarioFecha.obtenerAnio(bk.getCosteoFormulario().getFechaEmision()));

            } else {
                numero++;
                System.out.println("numero2: " + numero);
                bk.getCosteoFormulario().setCodigo(String.format(format, numero)
                        + "-" + UtilitarioFecha.obtenerAnio(bk.getCosteoFormulario().getFechaEmision()));

            }

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
        mostrarMensaje("Su Orden de Compra ahora ha sido emitida");
    }

    public void calcularTabla() {
        try {
            CosteoImportacion impor = bk.getCosteoFormulario();
            impor.setCif(impor.getFlete().add(impor.getSeguro()).add(impor.getTotal()));

            BigDecimal adValorem = BigDecimal.ZERO;
            BigDecimal otro = BigDecimal.ZERO;
            BigDecimal totalImportacion = BigDecimal.ZERO;
            //impor.setGastoTotal(impor.getAduana().add(impor.getOtro()));

            for (CosteoArticulo art : bk.getListaCosteoArticulo()) {
                art.setFlete(impor.getFlete().multiply(art.getCantidad()).divide(impor.getCantidad(), MathContext.DECIMAL32));
                art.setSeguro(impor.getSeguro().multiply(art.getCantidad()).divide(impor.getCantidad(), MathContext.DECIMAL32));
                art.setCif(impor.getCif().multiply(art.getCantidad()).divide(impor.getCantidad(), MathContext.DECIMAL32));

                art.setValAdvalorem(art.getCif().multiply(art.getPorcAdvalorem()).divide(new BigDecimal(100)));
                adValorem = adValorem.add(art.getValAdvalorem());

                art.setAduana(impor.getAduana().multiply(art.getCif()).divide(impor.getCif(), MathContext.DECIMAL32));

                //art.setOtro(impor.getOtro().multiply(art.getCantidad()).divide(impor.getCantidad(), MathContext.DECIMAL32));
                otro = otro.add(art.getOtro());
                art.setGastoTotal(art.getOtro().add(art.getAduana()));

                art.setTotalImportacion(art.getGastoTotal().add(art.getCif().add(art.getValAdvalorem())));
                totalImportacion = totalImportacion.add(art.getTotalImportacion());

                art.setCostoUnitario(art.getTotalImportacion().divide(art.getCantidad(), MathContext.DECIMAL32));
            }

            impor.setValAdvalorem(adValorem);
            impor.setOtro(otro);
            impor.setGastoTotal(impor.getAduana().add(impor.getOtro()));
            impor.setTotalImportacion(totalImportacion);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
